import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)

/**
 * Esta es la calse mundo del juego, desde aqui se controla todos los menus y objetos dentro del juego.
 * 
 * @author (Alvaro Alvarez Castañon) 
 * @version (1.00)
 */
public class Mundo extends World
{
    private Puntos puntaje;
    private Impactos countI;
    private Nivel  numLevel;
    public int nivel=0;
    private int numB;
    private int numI;
    int x1=50;
    int x2=120;
    int x3=190;
    int x4=260;
    int x5=330;
    int y1=40;
    int y2=110;
    int y3=180;
    int y4=250;
    int y5=320;
    int y6=390;
    
    /**
     * Constructor de el mundo, se crean los objetos necesarios para el mundo
     */
    public Mundo()
    {    
        // Create a new world with 600x400 cells with a cell size of 1x1 pixels.
        super(400, 500, 1); 
        puntaje = new Puntos();
        numLevel= new Nivel();
        
        menu();
    }
    
    /**
     * El metodo act de le mundo sirve para poder pasar por los diferentes 
     * puntos del menu del juego, esto es juego, ayuda y creditos.
     */
    public void act()
    {
        if(nivel==0 && Greenfoot.isKeyDown("enter"))
            menu();
    }
    
    /**
     * Regresa el puntaje que se tiene en el momento.
     */
    public Puntos getPoints()
    {
        return puntaje;
    }
    
    /**
     *En este metodo se realiza la generacion de las balas que aparecen 
     *al destruirse las burbujas y obtienen el valor en x, y de donde 
     *iniciaran el movimiento las balas, asi mismo se les proporciona la direccion.
     */
    public void generaBalas(int iniX, int iniY)
    {
        Bala b1 = new Bala(1);
        addObject(b1,iniX,iniY);
        Bala b2 = new Bala(2);
        addObject(b2,iniX,iniY);
        Bala b3 = new Bala(3);
        addObject(b3,iniX,iniY);
        Bala b4 = new Bala(4);
        addObject(b4,iniX,iniY);
    }
    
    /**
     * Aqui se crea el menu del juego cuando se inicia o se manda 
     * llamar desde algun otro punto del juego.
     */
     public void menu()
    {
        setBackground("menu.png");
        super.addObject(new Juego(), 68, 181);
        super.addObject(new Ayuda(), 314, 231);
        super.addObject(new Creditos(), 87, 360);
    }
    
    /**
     * manda llamar a la generacion del nivel, asi mismo coloca el mensaje de puntaje 
     * y el mensaje del numero de niveles.
     */
    public void setLevel(int nivel)
    {
        generaNivel();
        setBackground("fondo.jpg");
        addObject(puntaje, 80, 450);
        addObject(numLevel, 255, 450);
        // AQUI VA EL CAMBIO DE NIVEL EN PANTALLA
    }
    
    /**
     * Aqui se realiza la seleccion del nivle que se va a colocar dependiendo del 
     * nivel en el cual se encuentre el jugador.
     */
    public void generaNivel()
    {
        switch(nivel)
        {
            case 1:
                nivel1();
                break;
            case 2:
                nivel2();
                break;
            case 3:
                nivel3();
                break;
            case 4:
                nivel4();
                break;
            case 5:
                nivel5();
                break;
            case 6:
                nivel6();
                break;    
             case 7:
                nivel7();
                break;
            case 8:
                nivel8();
                break;
        }
    }
    
    /**
     * Indicaciones de la creacion y colocacion de los objetos en el nivel.
     */
    public void nivel1()
    {
        numI = 1;
        numB = 1;
        countI= new Impactos(numI);
        addObject(countI,80,485);
        Burbuja b1 = new Burbuja(4);
        addObject(b1,x3,y3);
    }
    
    /**
     * Indicaciones de la creacion y colocacion de los objetos en el nivel.
     */
    public void nivel2()
    {
        numI = 1;
        numB = 2;
        countI= new Impactos(numI);
        addObject(countI,80,485);
        Burbuja b1 = new Burbuja(4);
        addObject(b1,x2,y3);
        Burbuja b2 = new Burbuja(4);
        addObject(b2,x4,y3);
    }
    
    /**
     * Indicaciones de la creacion y colocacion de los objetos en el nivel.
     */
    public void nivel3()
    {
        numI = 1;
        numB = 9;
        countI= new Impactos(numI);
        addObject(countI,80,485);
        Burbuja b1 = new Burbuja(4);
        addObject(b1,x1,y1);
        Burbuja b2 = new Burbuja(4);
        addObject(b2,x3,y1);
        Burbuja b3 = new Burbuja(4);
        addObject(b3,x5,y1);
        Burbuja b4 = new Burbuja(4);
        addObject(b4,x1,y3);
        Burbuja b5 = new Burbuja(4);
        addObject(b5,x3,y3);
        Burbuja b6 = new Burbuja(4);
        addObject(b6,x5,y3);
        Burbuja b7 = new Burbuja(4);
        addObject(b7,x1,y6);
        Burbuja b8 = new Burbuja(4);
        addObject(b8,x3,y6);
        Burbuja b9 = new Burbuja(4);
        addObject(b9,x5,y6);
    }
    
    /**
     * Indicaciones de la creacion y colocacion de los objetos en el nivel.
     */
    public void nivel4()
    {
        numI = 1;
        numB = 20;
        countI= new Impactos(numI);
        addObject(countI,80,485);
        Burbuja b1 = new Burbuja(3);
        addObject(b1,x1,y2);
        Burbuja b2 = new Burbuja(3);
        addObject(b2,x2,y2);
        Burbuja b3 = new Burbuja(3);
        addObject(b3,x3,y2);
        Burbuja b4 = new Burbuja(3);
        addObject(b4,x4,y2);
        Burbuja b5 = new Burbuja(3);
        addObject(b5,x5,y2);//fin renglon 2
        Burbuja b6 = new Burbuja(3);
        addObject(b6,x1,y3);
        Burbuja b7 = new Burbuja(4);
        addObject(b7,x2,y3);
        Burbuja b8 = new Burbuja(4);
        addObject(b8,x3,y3);
        Burbuja b9 = new Burbuja(4);
        addObject(b9,x4,y3);
        Burbuja b10 = new Burbuja(3);
        addObject(b10,x5,y3);//fin renglon 3
        Burbuja b11 = new Burbuja(3);
        addObject(b11,x1,y4);
        Burbuja b12 = new Burbuja(4);
        addObject(b12,x2,y4);
        Burbuja b13 = new Burbuja(4);
        addObject(b13,x3,y4);
        Burbuja b14 = new Burbuja(4);
        addObject(b14,x4,y4);
        Burbuja b15 = new Burbuja(3);
        addObject(b15,x5,y4);//fin renglon 4
        Burbuja b16 = new Burbuja(3);
        addObject(b16,x1,y5);
        Burbuja b17 = new Burbuja(3);
        addObject(b17,x2,y5);
        Burbuja b18 = new Burbuja(3);
        addObject(b18,x3,y5);
        Burbuja b19 = new Burbuja(3);
        addObject(b19,x4,y5);
        Burbuja b20 = new Burbuja(3);
        addObject(b20,x5,y5);
    }
    
    /**
     * Indicaciones de la creacion y colocacion de los objetos en el nivel.
     */
    public void nivel5()
    {
        numI = 1;
        numB = 8;
        countI= new Impactos(numI);
        addObject(countI,80,485);
        Burbuja b1 = new Burbuja(4);
        addObject(b1,x2,y1);
        Burbuja b2 = new Burbuja(4);
        addObject(b2,x5,y1);
        Burbuja b3 = new Burbuja(3);
        addObject(b3,x2,y3);
        Burbuja b4 = new Burbuja(4);
        addObject(b4,x5,y3);
        Burbuja b5 = new Burbuja(3);
        addObject(b5,x2,y4);
        Burbuja b6 = new Burbuja(4);
        addObject(b6,x5,y4);
        Burbuja b7 = new Burbuja(4);
        addObject(b7,x2,y6);
        Burbuja b8 = new Burbuja(4);
        addObject(b8,x5,y6);
    }
    
    /**
     * Indicaciones de la creacion y colocacion de los objetos en el nivel.
     */
    public void nivel6()
    {
        numI = 1;
        numB = 5;
        countI= new Impactos(numI);
        addObject(countI,80,485);
        Burbuja b1 = new Burbuja(4);
        addObject(b1,x1,y3);
        Burbuja b2 = new Burbuja(3);
        addObject(b2,x2,y3);
        Burbuja b3 = new Burbuja(4);
        addObject(b3,x3,y3);
        Burbuja b4 = new Burbuja(4);
        addObject(b4,x4,y3);
        Burbuja b5 = new Burbuja(3);
        addObject(b5,x5,y3);
    }
    
    /**
     * Indicaciones de la creacion y colocacion de los objetos en el nivel.
     */
    public void nivel7()
    {
        numI = 2;
        numB = 11;
        countI= new Impactos(numI);
        addObject(countI,80,485);
        Burbuja b1 = new Burbuja(4);
        addObject(b1,x2,y2);
        Burbuja b2 = new Burbuja(4);
        addObject(b2,x4,y2);
        Burbuja b3 = new Burbuja(4);
        addObject(b3,x1,y3);
        Burbuja b4 = new Burbuja(3);
        addObject(b4,x2,y3);
        Burbuja b5 = new Burbuja(4);
        addObject(b5,x3,y3);
        Burbuja b6 = new Burbuja(3);
        addObject(b6,x4,y3);
        Burbuja b7 = new Burbuja(4);
        addObject(b7,x5,y3);
        Burbuja b8 = new Burbuja(3);
        addObject(b8,x2,y4);
        Burbuja b9 = new Burbuja(3);
        addObject(b9,x4,y4);
        Burbuja b10 = new Burbuja(4);
        addObject(b10,x2,y5);
        Burbuja b11 = new Burbuja(4);
        addObject(b11,x4,y5);
    }
    
    /**
     * Indicaciones de la creacion y colocacion de los objetos en el nivel.
     */
    public void nivel8()
    {
        numI = 3;
        numB = 30;
        countI= new Impactos(numI);
        addObject(countI,80,485);
        Burbuja b1 = new Burbuja(4);
        addObject(b1,x1,y1);
        Burbuja b2 = new Burbuja(3);
        addObject(b2,x2,y1);
        Burbuja b3 = new Burbuja(3);
        addObject(b3,x3,y1);
        Burbuja b4 = new Burbuja(3);
        addObject(b4,x4,y1);
        Burbuja b5 = new Burbuja(4);
        addObject(b5,x5,y1);//fin renglon 2
        Burbuja b6 = new Burbuja(3);
        addObject(b6,x1,y2);
        Burbuja b7 = new Burbuja(1);
        addObject(b7,x2,y2);
        Burbuja b8 = new Burbuja(2);
        addObject(b8,x3,y2);
        Burbuja b9 = new Burbuja(1);
        addObject(b9,x4,y2);
        Burbuja b10 = new Burbuja(2);
        addObject(b10,x5,y2);//fin renglon 3
        Burbuja b11 = new Burbuja(3);
        addObject(b11,x1,y3);
        Burbuja b12 = new Burbuja(4);
        addObject(b12,x2,y3);
        Burbuja b13 = new Burbuja(4);
        addObject(b13,x3,y3);
        Burbuja b14 = new Burbuja(4);
        addObject(b14,x4,y3);
        Burbuja b15 = new Burbuja(3);
        addObject(b15,x5,y3);//fin renglon 4
        Burbuja b16 = new Burbuja(3);
        addObject(b16,x1,y4);
        Burbuja b17 = new Burbuja(3);
        addObject(b17,x2,y4);
        Burbuja b18 = new Burbuja(3);
        addObject(b18,x3,y4);
        Burbuja b19 = new Burbuja(3);
        addObject(b19,x4,y4);
        Burbuja b20 = new Burbuja(3);
        addObject(b20,x5,y4);
        Burbuja b21 = new Burbuja(3);
        addObject(b21,x1,y5);
        Burbuja b22 = new Burbuja(4);
        addObject(b22,x2,y5);
        Burbuja b23 = new Burbuja(4);
        addObject(b23,x3,y5);
        Burbuja b24 = new Burbuja(4);
        addObject(b24,x4,y5);
        Burbuja b25 = new Burbuja(3);
        addObject(b25,x5,y5);//fin renglon 4
        Burbuja b26 = new Burbuja(3);
        addObject(b26,x1,y6);
        Burbuja b27 = new Burbuja(3);
        addObject(b27,x2,y6);
        Burbuja b28 = new Burbuja(3);
        addObject(b28,x3,y6);
        Burbuja b29 = new Burbuja(3);
        addObject(b29,x4,y6);
        Burbuja b30 = new Burbuja(3);
        addObject(b30,x5,y6);
    }
    
    /**
     * Aqui se crea el menu que aparece de ayuda, esto es quitar los objetos en el mundo  
     * y colocar la ayuda
     */
    public void Ayuda()
    {
        removeObjects(getObjects(Ayuda.class));
        removeObjects(getObjects(Juego.class));
        removeObjects(getObjects(Creditos.class));
        setBackground("ayuda.png");
    }
    
    /**
     * Aqui se crea el menu que aparece de creditos, esto es quitar los objetos en el mundo  
     * y colocar los creditos
     */
    public void Creditos()
    {
        removeObjects(getObjects(Ayuda.class));
        removeObjects(getObjects(Juego.class));
        removeObjects(getObjects(Creditos.class));
        setBackground("creditos.jpg");
    }
    
    /**
     * Aqui se le da el valor del nivel inicial, se cambia el fondo del juego para la
     * partida y se coloca los contadores de puntos y nivel.
     */
    public void Presiona()
    {
        nivel = 1;
        setLevel(nivel);
        setBackground("fondo.jpg");
        addObject(numLevel, 255, 450);
        addObject(puntaje, 80, 450);
        
    }
    
    /**
     * Metodo que ayuda para la reduccion del contador de las burbujas durante el juego.
     */
    public void disminuyeBurbujas()
    {
        numB= numB-1;
        if(numB==0)
        {
            nivel++;
            numLevel.Count(1);
            win();
        }
    }
    
    /**
     * Metodo que ayuda para la reduccion de impactos que hay en el nivel.
     */
    public void disminuyeImpactos()
    {
        numI = numI-1;
        if(numI==0)
        {
            if(numB==0)
            {
                nivel++;
                numLevel.Count(1);
                win();
            }
            else
            {
                gameover();
            }
        }
    }
    
    /**
     * muestra la pantalla de la partida cuando se perdio.
     */
    public void gameover()
    {
        removeObjects(getObjects(Burbuja.class));
        removeObjects(getObjects(Bala.class));
        setBackground("fondoper.jpg");
        Reintentar r= new Reintentar();
        addObject(r,126,327);
        Salir s= new Salir();
        addObject(s,294,327);
    }
    
    /**
     * Muestra elmenu cuando se logra pasar el nivel.
     */
    public void win()
    {
        setBackground("fondowin.jpg");        
        removeObjects(getObjects(Bala.class));
        Reintentar r= new Reintentar();
        addObject(r,126,327);
        Continuar c= new Continuar();
        addObject(c,294,327);
    }
    
    /**
     * Realiza la disminucion del numero de nivel cuando se quiere volver a jugar el nivel.
     */
    public void retry()
    {
        nivel=nivel-1;
        numLevel.Count(-1);
        setLevel(nivel);
    }
    
    /**
     * realiza la accion de colocar el siguiente nivel despues de pasar uno.
     */
    public void continuar()
    {
        setLevel(nivel);
    }
}
